const router = require('koa-router')()
const { card, record } = require('../omodels/card')
const validationMiddleware = require('../middleware/validate')
const response = require("../utils/response")
const path = require("path")
const fs = require('fs');
const dayjs = require('dayjs');
const { url } = require("../utils/url")
router.prefix('/card')
const rules = {
    '/add':{
        cover: {
            presence: { message: "请选择卡牌封面" },
            length:{minimum: 1,message: "请选择卡牌封面"}
        },
        title: {
            presence: { message: "请填写卡牌标题" },
            length:{minimum: 1,message: "请填写卡牌标题"}
        },
        desc: {
            presence: { message: "请填写卡牌描述" },
            length:{minimum: 1,message: "请填写卡牌描述"}
        },
    },
    '/del':{
        id: {
            presence: { message: "无id参数" },
        },
    },
    '/put': {
        id: {
            presence: {message: "无id参数"},
        },
    }
}

router.get('/list', async (ctx, next) => {
    let res = await card.find()
    if (res) {
        response.success(ctx, { data: res })
    } else {
        response.error(ctx, {})
    }
})

router.post('/add', validationMiddleware(rules),async (ctx, next) => {
    let params = ctx.request.body

        let res = await card.create(params)
        if (res) {
            response.success(ctx, {})
        } else {
            response.error(ctx, {})
        }


})

router.post('/addRecord', async (ctx, next) => {
    let params = ctx.request.body

    let res = await record.create({ cardId: params.id, time: dayjs().valueOf(), cardName: params.cardName })
    if (res) {
        response.success(ctx, {})
    } else {
        response.error(ctx, {})
    }
})

router.get('/recordList', async (ctx, next) => {
    let res = await record.find()
    if (res) {
        response.success(ctx, { data: res })
    } else {
        response.error(ctx, {})
    }
})

router.get('/init',async(ctx,next)=>{
    const initCard=[
        {
            name:'利滚利',
            icon:url+"利滚利加强版"+'.png',
            desc:"初始存酒一杯，接下来后续玩家每有一名不喝酒则存酒数加1,直接有人喝一杯酒。"
        },
        {
            name:'利滚利加强版',
            icon:url+"利滚利加强版"+'.png',
            desc:"初始存酒两杯，接下来后续玩家每有一名不喝酒则存酒数加1,直接有人喝酒。"
        },
        {
            name:'弹射1',
            icon:url+"弹射"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，可以指定另一名玩家也喝一半。"
        },
        {
            name:'弹射2',
            icon:url+"弹射"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，可以指定另一名玩家喝一样多。"
        },
        {
            name:'弹射3',
            icon:url+"弹射"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，可以指定另一名玩家多喝一半。"
        },
        {
            name:'屠龙勇士',
            icon:url+"屠龙勇士"+'.png',
            desc:"喝一杯开始游戏 1勇闯龙穴（连续喝三杯酒选择一名其他玩家喝一杯酒）2龙血之瓶（其他玩家轮流猜测，如果没有人猜中红色，则玩家 A 可以选择一名其他玩家喝一杯酒；如果有人猜中红色，则玩家 A 再喝一杯酒）。"
        },
        {
            name:'焦灼',
            icon:url+"焦灼"+'.png',
            desc:"每轮喝的第二次酒为白酒或原有的酒加一杯。"
        },
        {
            name:'金鳞龙',
            icon:url+"金鳞龙"+'.png',
            desc:"查看抽牌时间的秒数，369自己喝，除此之外奇数上家喝，偶数下家喝。"
        },
        {
            name:'潘多拉的酒杯',
            icon:url+"潘多拉的备战席"+'.png',
            desc:"回合你酒杯内的酒水量由你自己控制。"
        },
        {
            name:'星界龙',
            icon:url+"星界龙"+'.png',
            desc:"喝一杯，本回合你下一次的酒加倍。"
        },
        {
            name:'公里圆弧1',
            icon:url+"公里圆弧"+'.png',
            desc:"以你为圆心选择一个方向1个人喝酒。"
        },
        {
            name:'公里圆弧2',
            icon:url+"公里圆弧"+'.png',
            desc:"以你为圆心选择一个方向2个人喝酒。"
        },
        {
            name:'公里圆弧3',
            icon:url+"公里圆弧1"+'.png',
            desc:"以你为圆心选择一个方向3个人喝酒。"
        },
        {
            name:'猛兽之巢1',
            icon:url+"猛兽之巢"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，所有其他玩家也要喝一口。"
        },
        {
            name:'猛兽之巢2',
            icon:url+"猛兽之巢"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，所有其他玩家也要喝半杯。"
        },
        {
            name:'猛兽之巢3',
            icon:url+"猛兽之巢"+'.png',
            desc:"指定一名玩家，本回合他每次喝酒时，所有其他玩家也要喝一杯。"
        },
        {
            name:'最佳好友1',
            icon:url+"最佳好友1"+'.png',
            desc:"指定一名玩家，本回合喝的酒减半杯。"
        },
        {
            name:'最佳好友2',
            icon:url+"最佳好友II"+'.png',
            desc:"指定一名玩家，本回合喝的酒减一杯。"
        },
        {
            name:'最佳好友3',
            icon:url+"最佳好友3"+'.png',
            desc:"指定一名玩家，本回合喝的半杯饮料。"
        },
        {
            name:'玉龙',
            icon:url+"玉龙"+'.png',
            desc:"本回合免喝。"
        },
        {
            name:'背水一战',
            icon:url+"背水一战"+'.png',
            desc:"指定一名玩家与其干杯 直到对方认输为止(至少一杯)。"
        },
        {
            name:'战利品大师',
            icon:url+"战利品大师"+'.png',
            desc:"抽卡者任意选一名玩家石头剪刀布，胜利他直接喝(跳过他的轮次)，失败自己喝一杯。"
        },
        {
            name:'法师学会',
            icon:url+"法师学会"+'.png',
            desc:"自己喝一杯，同时指定一名玩家，本回合他喝的酒量翻倍。"
        },
        {
            name:'魔导师1',
            icon:url+"魔导师"+'.png',
            desc:"自己喝1.5杯。"
        },
        {
            name:'魔导师2',
            icon:url+"魔导师1"+'.png',
            desc:"自己喝2杯。"
        },
        {
            name:'魔导师3',
            icon:url+"魔导师2"+'.png',
            desc:"自己喝2.5杯。"
        },
        {
            name:'重骑兵1',
            icon:url+"重骑兵"+'.png',
            desc:"该回合强制所有人一起喝，你多喝半杯。"
        },
        {
            name:'重骑兵2',
            icon:url+"重骑兵"+'.png',
            desc:"该回合强制所有人一起喝，你多喝一杯。"
        },
        {
            name:'重骑兵3',
            icon:url+"重骑兵3"+'.png',
            desc:"该回合强制所有人一起喝，你多喝一杯半。"
        },
        {
            name:'实战训练1',
            icon:url+"实战训练2"+'.png',
            desc:"先喝一杯，玩家 A 成为“指挥官”，说出一个特定主题下的的事物，说不出喝半杯。"
        },
        {
            name:'实战训练2',
            icon:url+"实战训练2"+'.png',
            desc:"先喝一杯，玩家 A 成为“指挥官”，说出一个特定主题下的的事物，说不出喝一杯。"
        },
        {
            name:'实战训练3',
            icon:url+"实战训练3"+'.png',
            desc:"先喝一杯，玩家 A 成为“指挥官”，说出一个特定主题下的的事物，说不出喝一杯半。"
        },

        {
            name:'恶魔契约',
            icon:url+"恶魔契约"+'.png',
            desc:"自己喝2.5杯。"
        },


        {
            name:'诅咒冠冕',
            icon:url+"诅咒冠冕"+'.png',
            desc:"本轮免喝，下轮杯数加倍。"
        },
        {
            name:'神龙尊者',
            icon:url+"神龙尊者之冕"+'.png',
            desc:"把本轮的酒转为饮料。"
        },
        {
            name:'魔导师之冕',
            icon:url+"魔导师"+'.png',
            desc:"本轮指定一个人一直陪喝。"
        },
        {
            name:'护卫之冕',
            icon:url+"护卫"+'.png',
            desc:"本轮指定除自己外一个人免喝。"
        },
        {
            name:'冒险者之冕',
            icon:url+"冒险者"+'.png',
            desc:"开启真心话大冒险。"
        },
        {
            name:'活体锻炉',
            icon:url+"活体锻炉"+'.png',
            desc:"本轮每喝两杯酒下一杯可免喝。"
        },
        {
            name:'在一起更好',
            icon:url+"在一起更好"+'.png',
            desc:"你和左右两边人喝一杯。"
        },
        {
            name:'纷乱头脑',
            icon:url+"纷乱头脑"+'.png',
            desc:"喝一杯，本轮如果你已经喝两杯可以免喝。"
        },
        {
            name:'私教训练',
            icon:url+"私教训练"+'.png',
            desc:"你喝一杯饮料，你身边喝一杯酒。"
        },
        {
            name:'强攻',
            icon:url+"强攻"+'.png',
            desc:"喝半杯白酒。"
        },
        {
            name:'怒翼龙3',
            icon:url+"怒翼龙3"+'.png',
            desc:"喝一杯酒，指定一个人喝一杯饮料。"
        },
        {
            name:'肆意消费',
            icon:url+"肆意消费"+'.png',
            desc:"喝一杯酒，下一个人杯数加倍。"
        },
        {
            name:'神龙烈焰',
            icon:url+"神龙烈焰3"+'.png',
            desc:"喝一杯饮料，指定一个人一起喝。"
        },
        {
            name:'快速思考',
            icon:url+"快速思考"+'.png',
            desc:"喝一杯饮料，一杯酒。"
        },
        {
            name:'开摆',
            icon:url+"开摆"+'.png',
            desc:"本轮无任何行动，结束后喝一杯饮料。"
        },
        {
            name:'窃贼帮派1',
            icon:url+"窃贼帮派1"+'.png',
            desc:"抽1张牌执行效果，抽完结算。"
        },
        {
            name:'窃贼帮派2',
            icon:url+"窃贼帮派1"+'.png',
            desc:"抽2张牌执行效果，抽完结算。"
        },
        {
            name:'窃贼帮派3',
            icon:url+"窃贼帮派1"+'.png',
            desc:"抽3张牌执行效果，抽完结算。"
        },
        {
            name:'暮光遮蔽1',
            icon:url+"暮光遮蔽"+'.png',
            desc:"跳过你的回合。"
        },
        {
            name:'暮光遮蔽2',
            icon:url+"暮光遮蔽"+'.png',
            desc:"跳过你跟你身边人回合。"
        },


        {
            name:'勃然大怒',
            icon:url+"勃然大怒"+'.png',
            desc:"本回合必须喝酒，至少一杯酒。"
        },
        {
            name:'提亚马特',
            icon:url+"提亚马特"+'.png',
            desc:"指定一个人及其身边人喝一杯。"
        },
        {
            name:'泰坦之路',
            icon:url+"泰坦之路"+'.png',
            desc:"本轮酒都追加一杯。"
        },
        {
            name:'伺机待发',
            icon:url+"伺机待发"+'.png',
            desc:"你上家不喝你喝反之亦然。"
        },

        {
            name:'永恒保护',
            icon:url+"永恒保护"+'.png',
            desc:"指定一个人本轮喝酒转为喝饮料。"
        },
        {
            name:'后期专家',
            icon:url+"后期专家"+'.png',
            desc:"一人喝一杯饮料。"
        },
        {
            name:'风暴之眼',
            icon:url+"风暴之眼"+'.png',
            desc:"击鼓传花。"
        },
        {
            name:'器械专家',
            icon:url+"器械专家"+'.png',
            desc:"本轮喝饮料转为两倍的酒。"
        },    {
            name:'装备升级',
            icon:url+"装备升级"+'.png',
            desc:"每喝一杯酒转为喝两杯饮料。"
        },      {
            name:'派对礼物',
            icon:url+"派对礼物"+'.png',
            desc:"本轮每人抽两次选择执行，抽完结算。"
        },
        {
            name:'游牧者',
            icon:url+"游牧者"+'.png',
            desc:"你身边人喝一杯包括对面。"
        },
        {
            name:'派对时间',
            icon:url+"派对时间"+'.png',
            desc:"跳过奇数人轮次。"
        }, {
            name:'忏悔',
            icon:url+"忏悔"+'.png',
            desc:"如果本轮你被指定过，下一波无法被指定。"
        },
        {
            name:'古代档案',
            icon:url+"古代档案"+'.png',
            desc:"抽三张选一张执行。"
        },






    ]
    initCard.forEach(e=>{
        card.create({
            title:e.name,
            cover:e.icon,
            desc:e.desc
        })
    })


})


router.delete('/del',validationMiddleware(rules,'query') ,async (ctx, next) => {
    let params = ctx.request.query
        let res = await card.findByIdAndDelete(params.id)
        if (res) {
            response.success(ctx, {})
        } else {
            response.error(ctx, {})
        }
})

router.put('/put',validationMiddleware(rules), async (ctx, next) => {
    let params = ctx.request.body

        let res = await card.findByIdAndUpdate(params.id, params)
        if (res) {
            response.success(ctx, {})
        } else {
            response.error(ctx, {})
        }

})
router.get('/cardCoverList', async (ctx, next) => {
    const directoryPath = path.join(__dirname, '../public/covers');
    // 检查目录是否存在
    if (!fs.existsSync(directoryPath)) {
        ctx.throw(404, 'Directory not found.');
    }
    // 读取目录下的文件
    const files = fs.readdirSync(directoryPath);
    let datacovers = await card.find()
    const getDifference = (universe, subset) => {
        // 将 subset 转换成 Set，以便快速查找
        const subsetSet = new Set(subset);

        // 使用 filter 方法找出不在 subsetSet 中的元素
        const difference = universe.filter(element => !subsetSet.has(element));

        return difference;
    }


    response.success(ctx, { data: getDifference(files.map(e => url + e), datacovers.map(e => e.cover)) })
})

module.exports = router
